﻿#region 참조 네임스페이스

using System;
using System.Diagnostics;
using Skying.Diagnostics.Logger.Coodinator;

#endregion

namespace Skying.Diagnostics.Logger.Entry
{
	/// <summary>
	/// 로깅 메시지와 <see cref="System.Exception"/> 정보를 로깅하기 위한 추상 클래스 원형을 제공한다.
	/// </summary>
	/// <remarks>
	/// <para>이 클래스를 상속하는 경우 <see cref="Skying.Diagnostics.Logger.Entry.LogEntry.Log"/> 메서드를 재정의해야 한다.</para>
	/// </remarks>
	public abstract class LogEntry
	{
		#region 프로퍼티

		/// <summary>
		/// 엔트리 명칭을 가져온다.
		/// </summary>
		public string EntryName
		{
			get;
			protected set;
		}

		/// <summary>
		/// <see cref="Skying.Diagnostics.Logger.Entry.LogEntry"/>의 <see cref="Skying.Diagnostics.Logger.Coodinator.LogCoodinator"/>를 가져온다.
		/// </summary>
		public LogCoodinator Coodinator
		{
			get;
			set;
		}

		#endregion

		#region 생성자/소멸자

		protected LogEntry(string entryName, LogCoodinator coodinator)
		{
			this.EntryName = entryName;

			this.Coodinator = coodinator;
		}

		#endregion

		#region 로깅

		/// <summary>
		/// 메시지와 <see cref="System.Exception"/> 정보를 로깅한다.
		/// </summary>
		/// <param name="message">로깅할 메시지를 설정한다.</param>
		/// <param name="logSeverity">로그 심각도를 설정한다.</param>
		/// <param name="logDateTime">로깅 일시를 설정한다.</param>
		/// <param name="stackFrame">로그 발생 지점의 <see cref="System.Diagnostics.StackFrame"/>을 설정한다.</param>
		/// <param name="exception">로깅할 <see cref="System.Exception"/> 정보를 설정한다. null을 허용한다.</param>
		public abstract void Log(string message, LogSeverity logSeverity, DateTime logDateTime, StackFrame stackFrame, Exception exception = null);

		#endregion
	}
}